package com.cskaoyan.javase.array._2memory;

/**
 * 数组是典型的引用数据类型
 * 我们可以通过数组的初始化过程，来了解引用数据类型。
 * 来看一看什么是引用数据类型变量，它和基本数据类型变量有什么区别。
 *
 * 这里我们通过一个数组的动态初始化，来了解引用数据类型。
 *
 * @since 10:13
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo2 {
    public static void main(String[] args) {
        // 数组的动态初始化
        /*
            该条语句由两个部分组成：
                1.数组的声明,声明了一个数组变量arr
                    arr这个变量是一个什么变量?
                    引用数据类型变量
                    它是一个局部变量
                    这个局部变量数组名,要直接存储在方法栈帧中

                2.数组的初始化,使用了new关键字
                    表示在堆上开辟空间,创建数组对象

                所以一个数组变量(引用数据类型变量),就由两个部分组成
                    1.在栈上开辟空间,存储数组名,称之为引用数据类型的引用(简称引用)
                    2.在堆上开辟空间,创建引用数据类型的对象
                引用数据类型 = 引用 + 对象

                对于引用数据类型而言,对象和引用谁才是本质?
                对象是实质,对象是存储数据的
                但是我们访问对象,不能直接访问,而是只能通过引用间接访问

                那么引用怎么和对象产生联系呢?"="表示什么呢?
                引用通过存储对象在内存中的地址,从而和对象产生联系
                引用中存的是地址,对象中存储的才是具体数据

         */
        int[] arr = new int[3];
        // 接下来对数组做一些常规操作
        /*
            直接输出数组名得到一个字符串：[I@1540e19d
            解释：
                [表示这是一个一维数组
                I表示该数组是int类型
                @后面跟的是一个十六进制数
                那么这个十六进制数表示什么呢？
                这个十六进制数可以近似的看成是对象的地址值
         */
        System.out.println(arr);
        System.out.println(arr.length);
        /*
            int类型数组的动态初始化
            元素具有默认值为0
         */
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);
        arr[0] = 100;
        System.out.println(arr[0]);
        /*
            通过引用操作数组对象,改变数组元素的取值
            不会改变数组结构本身
         */
        System.out.println(arr);
    }
}
